home *** CD-ROM | disk | FTP | other *** search
/ boe.pres.k12.wv.us / boe.pres.k12.wv.us.zip / boe.pres.k12.wv.us / Utilities / Xerox Workcentre 5335 / Windows Scan / 64-bit_x64 / Portugues / cpsimage.cab / data / pdf / img2mrc.elf next >
Text File  |  2009-03-16  |  6KB  |  187 lines

  1. //img2mrc
  2.  
  3. #import    "documentio.ucm";
  4. #import    "fiji2xip.ucm";
  5. #import    "fwx2xip.ucm";
  6. #import    "ipcore2xip.ucm";
  7. #load      "xipProcs/skewAngle.proc";
  8. #load      "xipProcs/printImageLayers.proc";
  9. #load      "xipProcs/getOcrPage.proc";
  10. LoadClasses ( filename: "xeng" );
  11.  
  12. IMPORT STRING  infile;
  13. IMPORT STRING  language     = "English";
  14. IMPORT INTEGER ocr          = 1;
  15. IMPORT INTEGER visibleText  = 0;
  16. IMPORT INTEGER verbosity    = 1;
  17. IMPORT STRING  format       = "pdf";
  18. IMPORT INTEGER security     = 0;
  19. IMPORT INTEGER correctImage = 1;
  20.  
  21. if ( !infile) {
  22.     print "Usage: xipe img2mrc.elf -im  infile:s <srcFile>";
  23.     print "  Options:";
  24.     print "    format:s       pdf|xps|all    default pdf";
  25.     print "    ocr:i          0|1            default 1";
  26.     print "    correctImage:i 0|1            default 1";
  27.     print "    language:s     <language>     default english";
  28.     print "    security:i     0|1            default 0";
  29.     print "    visibleText:i  0|1            default 0";
  30.     print "    verbosity:i    0|1|2          default 1";
  31.     print "  Reorient should be turned off for";
  32.     print "    non-Latin 1 languages.";
  33.     end;
  34. }
  35.  
  36. /*
  37.  * This is needed so real rotate matches behavior of lazyRotate.
  38.  * Don't want the image width/height to be modified (other than swapping them)
  39.  */
  40. PROCEDURE hardRotate(XIPIMAGE img, DOUBLE angle)
  41.   RETURNS (XIPIMAGE out)
  42. {
  43.     INTEGER ww = img.imageWidth;
  44.     INTEGER hh = img.imageHeight;
  45.     if (angle <    0 ) angle = angle + 360.0;
  46.     if (angle >= 360 ) angle = angle - 360.0;
  47.     INTEGER cnt    = angle/90; // This does rounding
  48.     DOUBLE  orient = cnt*90;
  49.     DOUBLE  skew   = angle - orient;
  50.     img            = img.rotate ( fangle: orient, nomask: 1);
  51.     if ( (cnt%2)==1 ) {
  52.         img.imageHeight = ww;
  53.         img.imageWidth  = hh;
  54.     }
  55.     out = img.rotate  ( fangle: skew,  nomask: 1, lock: 1);
  56. }
  57.  
  58. PROCEDURE convertToBinary (XIPIMAGE input)
  59.   RETURNS (XIPIMAGE mask)
  60. {
  61.    // Loop through all layers getting list of images and normalized offsets
  62.    ELFLIST imgs;      // list of images to be merged
  63.    ELFLIST posList;   // list of x,y merge positions
  64.    INTEGER i;
  65.    STATUS  status;
  66.    XIPIMAGE tmp;
  67.    INTEGER ltype;
  68.  
  69.    for ( i=0; i<input.nlayers; i++ ) {
  70.          ltype = input.getMember (member:"layerType", num: i);
  71.       if (ltype == XIP_ColorMask || ltype == XIP_ContoneMask) {
  72.           tmp = input.getLayer(num:i).unCompress();
  73.  
  74.           // Add mask layer to accomodate image overlaps
  75.           tmp = tmp.channel (command: ("Insert image 1 Mask A"), input: (tmp) );
  76.           imgs.insert ( obj: tmp);
  77.  
  78.           posList.insert (obj:input.getMember(num:i,member:"ypos") / input.imageHeight);
  79.           posList.insert (obj:input.getMember(num:i,member:"xpos") / input.imageWidth);
  80.     }
  81.    }
  82.  
  83.    STRING res = "Origin:resolution:" + input.resolution[0];
  84.    if (input.nlayers > 1) {
  85.       // Create a background plane and merge all layers onto it
  86.       try {
  87.         mask = pattern (constant:(0), space: "klinear",
  88.                             size: (input.imageWidth, input.imageHeight)
  89.              ).convert (to: (1)
  90.              ).nmerge (input: imgs,
  91.                      foffset: posList
  92.              ).modheader (modify: ("Photometry:name:graylinear")
  93.              ).modheader (modify: (res)
  94.              ).paper (
  95.              ).invert (
  96.              ).exec ();
  97.       } catch {
  98.         print status.message; end;
  99.       }
  100.    }
  101.    else mask = input.getLayer(num:0).Copy();
  102. }
  103.  
  104. PROCEDURE getAngleAndOCR(XIPIMAGE img, STRING language, INTEGER visible, INTEGER ocr)
  105.     RETURNS(DOUBLE corr)
  106. {
  107.     XIPIMAGE binimg = convertToBinary (input:img);
  108.     DOUBLE   orient = binimg.orient();
  109.     DOUBLE   skew   = -1.0 * skewAngle ( img: binimg, type: "binary" );
  110.     if (skew > -0.1 && skew < 0.1) skew = 0;
  111.     corr            = skew + orient;
  112.     print "  Correction angle: "+orient+"  "+skew+" = "+corr;
  113.     if (ocr) {
  114.         BOOLEAN doCorr  = corr != 0;
  115.     
  116.         if (doCorr) {
  117.             binimg = hardRotate(img: binimg, angle: corr);
  118.         } else {
  119.             corr = 0;
  120.         }
  121.         INTEGER         ww = binimg.imageWidth;
  122.         INTEGER         hh = binimg.imageHeight;
  123.         STRING     ocrxdoc = binimg.fwxOCR (texttype: "XDOC", language: language);
  124.         XIPIMAGE    ocrimg = XDOCtoXIPXML(xdoc: ocrxdoc);
  125.         // print PrintImageLayers(img:ocrimg);
  126.         ocrimg.imageWidth  = ww; // The xdoc dimensions are sometimes a little off
  127.         ocrimg.imageHeight = hh; // The xdoc dimensions are sometimes a little off
  128.         // print PrintImageLayers(img:ocrimg);
  129.         // ocrxdoc.Write(filename: "junk.xdoc");
  130.  
  131.         if (doCorr) {
  132.             ocrimg.setTransform(op: "rotate", angle:  -corr);
  133.         }
  134.         if (visible) {
  135.             ocrimg.setMember (member: "visibility", value: TRUE);
  136.         }
  137.         img.addLayer(image:ocrimg, ltype: XIP_Text);
  138.     }
  139. }
  140.  
  141. // *** MAIN ******************************************************************
  142.  
  143.  
  144. XIPIMAGE img;
  145. XIPIMAGE thumb;
  146. DOUBLE   angle = 0;
  147.  
  148. if (infile.ext() == "jpg") {
  149.     img   = readjpg (filename: infile, compressed:TRUE, rawcolor: TRUE);
  150.     thumb = readjpg (filename: infile).thumbnail(size: (200, 200));
  151. } else {
  152.     img   = readimage (filename: infile);
  153.     thumb = img.thumbnail(size: (200, 200));
  154. }
  155. XIPIMAGE  ims = img.fijiSeg (cfgfile: "$XIPTOP/data/fiji/fijiNlc.cfg");
  156. if (verbosity>0) print "  " + TimeCheck() + " secs to read and compress.";
  157. if (verbosity>1) print PrintImageLayers(img:ims);
  158.  
  159. if (correctImage || ocr) {
  160.     angle = getAngleAndOCR(
  161.         img: ims, language: language, visible: visibleText, ocr: ocr);
  162.     if (verbosity>1) print PrintImageLayers(img:ims);
  163. }
  164.  
  165. if (correctImage && angle!=0) {
  166.     ims.setTransform(op: "rotate", angle: angle);
  167.     thumb = hardRotate(img:thumb,  angle: angle);
  168. }
  169. ims.addLayer(image:thumb, ltype: XIP_Thumbnail);
  170. if (verbosity>1) print PrintImageLayers(img:ims);
  171.  
  172. ims.setTransform(op: "center", std:"US");
  173. if (verbosity>1) print PrintImageLayers(img:ims);
  174.  
  175. if (format == "xps" || format == "all") {
  176.     System (cmd : "(rm -rf "+ infile.name()+".xps" + ") > /dev/null; ");
  177.     DOCUMENTWRITER dwxps = CreateDocumentWriter (filename: infile.name()+".xps");
  178.         dwxps.setAttr(name:"_XPSsecurity", obj:security);
  179.         dwxps.appendPage (pgImg: ims); dwxps.release();
  180.         if (verbosity>0) print "  writing:"              + infile.name()+".xps";
  181. }
  182. if (format == "pdf" || format == "all") {
  183.     DOCUMENTWRITER dwpdf = CreateDocumentWriter (filename: infile.name()+".pdf");
  184.         dwpdf.appendPage (pgImg: ims); dwpdf.release();
  185.         if (verbosity>0) print "  writing:"              + infile.name()+".pdf";
  186. }
  187.